package com.huawei.dws.demo;

import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.dws.v2.DwsClient;
import com.huaweicloud.sdk.dws.v2.model.CreateClusterV2Request;
import com.huaweicloud.sdk.dws.v2.model.ListClusterDetailsRequest;
import com.huaweicloud.sdk.dws.v2.model.ListClusterDetailsResponse;
import com.huaweicloud.sdk.dws.v2.model.PublicIp;
import com.huaweicloud.sdk.dws.v2.model.V2CreateCluster;
import com.huaweicloud.sdk.dws.v2.model.Volume;
import com.huaweicloud.sdk.dws.v2.model.V2CreateClusterReq;
import com.huaweicloud.sdk.dws.v2.model.CreateClusterV2Response;
import com.huaweicloud.sdk.dws.v2.region.DwsRegion;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

public class CreateClusterV2 {
    private static final Logger logger = LoggerFactory.getLogger(CreateClusterV2.class.getName());

    public static void main(String[] args) {
        /*
         * 初始化认证信息,相关参数说明如下所示：
         *   - ak：华为云账号Access Key。
         *   - sk：华为云账号Secret Access Key 。
         *   - projectId：项目id。
         *   - dwsEndpoint：服务对应区域终端节点地址，通过regionId映射获取。
         */
        String ak = "<ak>";
        String sk = "<sk>";
        String projectId = "<projectId>";
        String regionId = "<regionId>";

        // 初始化认证
        BasicCredentials credentials = new BasicCredentials().withAk(ak).withSk(sk).withProjectId(projectId);

        // 初始化DwsClient客户端
        DwsClient client = DwsClient.newBuilder()
            .withCredential(credentials)
            .withRegion(DwsRegion.valueOf(regionId))
            .build();

        try {
            // 构建请求体
            CreateClusterV2Request request = new CreateClusterV2Request();
            setRequestBody(request);

            // 接收响应结果
            CreateClusterV2Response response = client.createClusterV2(request);
            logger.info(response.toString());

            // 查询集群创建结果，创建集群需要10～15分钟，可等待查询创建结果
            String clusterId = response.getCluster().getId();
            ListClusterDetailsRequest detailsRequest = new ListClusterDetailsRequest().withClusterId(clusterId);
            ListClusterDetailsResponse detailsResponse = client.listClusterDetails(detailsRequest);
            logger.info(detailsResponse.toString());
        } catch (Exception e) {
            logger.error("failed", e);
        }

    }

    /*
     * V2创建集群相关参数说明如下所示：
     *   - name：集群名称，要求唯一性，必须以字母开头并只包含字母、数字、中划线或下划线，长度为4~64个字符。
     *   - flavor：集群规格名称。节点规格详情请参见数据仓库规格。
     *   - num_cn：集群CN数量，取值范围为2~集群节点数，最大值为20，默认值为3。
     *   - num_node：集群节点数量，集群模式取值范围为3~256，实时数仓（单机模式）取值为1。
     *   - db_name：管理员用户名称。用户命名要求如下：
     *              只能由小写字母、数字或下划线组成。
     *              必须由小写字母或下划线开头。
     *              长度为6~64个字符。
     *              用户名不能为DWS数据库的关键字。
     *   - db_password：管理员用户密码。
     *              8~32个字符
     *              至少包含以下字符中的3种：大写字母、小写字母、数字和特殊字符（~!?,.:;-_(){}[]/<>@#%^&*+|\=）。
     *              不能与用户名或倒序的用户名相同。
     *   - db_port：集群数据库端口，取值范围为8000~30000，默认值：8000。
     *   - availability_zones：可用区列表。集群可用区选择详情请参见地区和终端节点
     *   - vpc_id：指定虚拟私有云ID，用于集群网络配置。
     *   - subnet_id：指定子网ID，用于集群网络配置。
     *   - security_group_id： 指定安全组ID，用于集群网络配置。非必选。
     *   - publicBindType：弹性IP绑定类型，取值如下：auto_assign：自动绑定 not_use：暂未使用 bind_existing ：使用已有。
     *   - eipId：弹性IP的id。非必选。
     *   - datastore_version：集群版本。
     *   - volume：磁盘名称，取值范围为 ：SSD（超高IO） 高IO（SAS） 普通IO（SATA）。非必选。
     *   - capacity: 磁盘容量。非必选。
     *   - enterpriseProjectId：企业项目ID，对集群指定企业项目，如果未指定，则使用默认企业项目“default”的ID，即0，非必选。
     */
    private static void setRequestBody(CreateClusterV2Request request) {
        String name = "<name>";
        String flavor = "<flavor>";
        Integer numCn = 3;
        Integer numNode = 3;
        String dbName = "<dbName>";
        String dbPassword = "<dbPassword>";
        Integer dbPort = 8000;
        List<String> availabilityZones = new ArrayList<>();
        availabilityZones.add("<availabilityZone>");
        String vpcId = "<vpcId>";
        String subNetId = "<subnetId>";
        String securityGroupId = "<securityGroupId>";
        String publicBindType = "<publicBindType>";
        String eipId = "<eipId>";
        String datastoreVersion = "<datastoreVersion>";
        String volume = "<volume>";
        Integer capacity = 100;
        String enterpriseProjectId = "0";

        // 配置创建集群相关参数
        V2CreateCluster v2ClusterInfo = new V2CreateCluster()
            .withName(name)
            .withFlavor(flavor)
            .withNumCn(numCn)
            .withNumNode(numNode)
            .withDbName(dbName)
            .withDbPassword(dbPassword)
            .withDbPort(dbPort)
            .withAvailabilityZones(availabilityZones)
            .withVpcId(vpcId)
            .withSubnetId(subNetId)
            .withSecurityGroupId(securityGroupId)
            .withPublicIp(new PublicIp().withPublicBindType(publicBindType).withEipId(eipId))
            .withDatastoreVersion(datastoreVersion)
            .withVolume(new Volume().withVolume(volume).withCapacity(capacity))
            .withEnterpriseProjectId(enterpriseProjectId);

        // 构建请求体
        V2CreateClusterReq requestBody = new V2CreateClusterReq().withCluster(v2ClusterInfo);
        request.setBody(requestBody);
    }
}
